jjzjj

c++ - xvalues : differences between non class types and class types

全部标签

c++ - 自动 xvalue 优化

有点令人惊讶(对我来说),以下两个程序编译成不同的输出,后一个具有更好的性能(用gcc和clang测试):#includeintmain(){std::vectora(2b(2对比#includeintmain(){std::vectora(2b(2有人可以向我解释为什么编译器会(或不能)在最后一次赋值中自动将b视为xvalue并在没有显式std::move的情况下应用move语义>Actor?编辑:用(g++|clang++)-std=c++11-O3-otesttest.cpp编译 最佳答案 Compilerscan'tbrea

c++ - 自动 xvalue 优化

有点令人惊讶(对我来说),以下两个程序编译成不同的输出,后一个具有更好的性能(用gcc和clang测试):#includeintmain(){std::vectora(2b(2对比#includeintmain(){std::vectora(2b(2有人可以向我解释为什么编译器会(或不能)在最后一次赋值中自动将b视为xvalue并在没有显式std::move的情况下应用move语义>Actor?编辑:用(g++|clang++)-std=c++11-O3-otesttest.cpp编译 最佳答案 Compilerscan'tbrea

c++ - 将 xvalues 转换为 lvalues 以传递给函数是否定义明确?

RecentlyI'vediscovered有时能够临时将右值转换为左值对我有用。我一直在使用以下工具:#includetemplateinlineconstexprstd::remove_reference_t&lvalue(T&&r)noexcept{returnstatic_cast&>(r);}当您必须使用需要左值的函数时,它很有用争论,但你对那些特别的东西没有任何兴趣值变成。当您对其他输出感兴趣时与给定的特定参数无关的vector。例如,这个:std::stringget_my_file(){std::ifstreamifs("myfile.txt");return{std:

c++ - 将 xvalues 转换为 lvalues 以传递给函数是否定义明确?

RecentlyI'vediscovered有时能够临时将右值转换为左值对我有用。我一直在使用以下工具:#includetemplateinlineconstexprstd::remove_reference_t&lvalue(T&&r)noexcept{returnstatic_cast&>(r);}当您必须使用需要左值的函数时,它很有用争论,但你对那些特别的东西没有任何兴趣值变成。当您对其他输出感兴趣时与给定的特定参数无关的vector。例如,这个:std::stringget_my_file(){std::ifstreamifs("myfile.txt");return{std:

c++ - 为什么右值引用绑定(bind)到 xvalue 在我的代码中不起作用?

我试图理解C++11中的左值和右值。于是我写了一段测试代码:intx=10;intfoo(){returnx;}int&bar(){returnx;}int&&baz(){return10;}intmain(){int&lr1=10;//error:lvaluereferencesrvalueint&lr2=x;//okint&lr3=foo();//error:lvaluereferencesrvalueint&lr4=bar();//okint&lr5=baz();//error:lvaluereferencesrvalueint&&rr1=10;//okint&&rr2=x;//

c++ - 为什么右值引用绑定(bind)到 xvalue 在我的代码中不起作用?

我试图理解C++11中的左值和右值。于是我写了一段测试代码:intx=10;intfoo(){returnx;}int&bar(){returnx;}int&&baz(){return10;}intmain(){int&lr1=10;//error:lvaluereferencesrvalueint&lr2=x;//okint&lr3=foo();//error:lvaluereferencesrvalueint&lr4=bar();//okint&lr5=baz();//error:lvaluereferencesrvalueint&&rr1=10;//okint&&rr2=x;//

c++ - 右值的成员访问运算符应该是一个 xvalue 吗?

在cppreferncesection:Valuecategories,它指出“对象表达式的成员,其中a是右值,m是非引用类型的非静态数据成员”是一个xvalue。在标准中(我在:N4140,thedraftC++14standard中找到)它声明(在第87页)“表达式是一个xvalue,如果它是......一个类成员访问表达式,指定非引用类型的非静态数据成员其中对象表达式是一个xvalue。”我想用下面的代码检查我对此的理解:structB{//BforBoring...inti{0};};templatestructV{V(){coutstructV{//PartialSpecia

c++ - 在重载决议方面,xvalue 和 prvalue 之间的行为差​​异的一个具体、简洁的例子是什么?

几个星期以来,我一直在仔细研究右值和右值引用。我越来越有信心,我对以下两者之间的区别有了一定的了解:定义变量或函数参数的类型(即intx;与int&&x=…;表达式的表达式类别,包括那些可能使用先前定义的参数的表达式(即给定函数定义A&&foo(),以及给定的表达式仅包含foo()的表达式类别是“xvalue”)子表达式在包含表达式中使用时的子表达式求值结果的类型(即,给定foo的相同定义,在包含表达式中使用时,子表达式foo()的类型是A(不是A&&))。我的问题是关于xvalue表达式和prvalue表达式(这两个表达式类别都是右值)之间的区别。给定:classA{};A&&foo

c++ - "xvalue has identity"是什么意思?

C++11引入了新的值类别,其中之一是xvalue.是explained由Stroustrup描述为类似(im类别):“它是一个值,具有身份,但可以从中move”。另一个来源,cppreference解释:aglvalueisanexpressionwhoseevaluationdeterminestheidentityofanobject,bit-field,orfunction;和xvalue是glvalue,所以这句话对于xvalue是正确的也是。现在,我认为如果xvalue有身份,那么我可以检查两个xvalues指的是同一个对象,所以我取xvalue的地址.事实证明,这是不允许

c++ - `const &&` 是否绑定(bind)到所有 prvalues(和 xvalues)?

C++标准定义删除了以下函数;templatevoidref(constT&&)=delete;templatevoidcref(constT&&)=delete;这是为了通过禁止函数绑定(bind)到临时值(右值)来帮助确保函数不被滥用。const&&是否绑定(bind)到所有右值,特别是纯右值?const&&会绑定(bind)到所有“移动的对象”(xvalues;基本上是从std::move或类似的返回的东西)吗?我可以推断它应该如此,但我对此没有任何“证据”。或者相反,是否存在右值(prvalue或xvalue)不会绑定(bind)到const&&的情况?如果是,怎么会这样?注意